package com.red.dubbo;

import com.red.usespringboot.UserService;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DubbospringbootApplication {

    /**
     *
     *
     * new SpringApplication（） 初始化 各种属性
     *  1.推测容器类型 none, reactive,servlet
     *  2.从spring.factories 中获取BootstrapRegistryInitializer 对象
     *  3.从spring.factories setInitializer
     *  4. setListeners ApplicationListener
     *
     *
     * run 方法
     *  1.创建 SpringApplicationRunListener
     *  2.starting--生命周期方法
     *  3.准备 Environment
     *  4.environment prepared-生命周期方法
     *  5.打印banner
     *  6.创建spring容器
     *  7.执行容器初始化器 applicationContextInitializer
     *  8.contextPrepared-生命周期方法
     *  9.向spring 容器添加配置类 run 传入进来的类,给spring 配置类
     *  10.contextLoaded-生命周期方法 。现在spring 容器里面只有配置类，还没有进行bean 扫描
     *  11.启动spring 容器 --扫描bean 添加bean-->            this.refreshContext(context);  AbstractApplicationContext.refresh();
     *    11.1 扫描配置类，也扫描自动配置类 AutoConfigurationImportSelector 实现了DeferredImportSelector 接口
     *       11.1.1 先扫描
     *       11.1.2 得到新的配置类。自己写的
     *       11.1.3 AutoConfigurationImportSelector.selectImports() 得到配置 spring.factories
     *
     *    11.2 会调用 onrefresh 方法，启动tomcat 或者jetty
     *
     *
     *  12.afterRefresh --模版方法
     *     13.started --生命周期方法
     *  14.callRunners
     *
     *     15.抛异常后 failed -生命周期方法
     *  16.running --生命周期方法
     *
     *
     *
     *
     * @param args
     */
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(DubbospringbootApplication.class, args);
        UserService userService = (UserService) context.getBean("userService");
        userService.test();

    }



    @Bean
    public ApplicationRunner  applicationRunner(){
        return args -> {
            // args 是 main 方法传入的命令行参数
            String[] sourceArgs = args.getSourceArgs();
            for (String sourceArg : sourceArgs) {
                System.out.println("applicationRunner"+sourceArg);
            }

//            jdbcTemplate.execute("create table if not exists tb_user (\n" +
//                    "                                       USER_ID int not null primary key auto_increment,\n" +
//                    "                                       USER_NAME varchar(100)\n" +
//                    "    )");
//
//            jdbcTemplate.execute("INSERT INTO tb_user (USER_ID,USER_NAME) VALUES(1,'赵六')");
        };
    }

    @Bean
    public CommandLineRunner commandLineRunner(){
        return args -> {
            // args 是 main 方法传入的命令行参数
            for (String arg : args) {
                System.out.println("commandLineRunner"+arg);

            }
            
        };
    }

}
